/*
专为处理iframe的类,如果写在线编辑器,可以减少很多工作量
如果moo再提供Range对象的兼容封装,那就完美了
*/
var IFrame = new Native({

 //族名，为$type方法提供精准类型
 name: 'IFrame',

 //不需要方法静态化
 generics: false,

 initialize: function(){
  /*
  获取参数,结合Array.link,实现两个参数的位置无关性
  也就是说,初始化的时候只需要提供两个参数,一个为DOM的iframe或其id,另一个是Object类型的
  两参数的位置先后没有关系,程序都能正确识别到,如:
  var iframe = new IFrame('frameID', { onload : function(){alert('iframe loaded');});
  和
  var iframe = new IFrame({ onload : function(){alert('iframe loaded');}, 'frameID');
  是等价的,由此可见Array.link的优雅
  */
  var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
  //双竖线实现默认值的写法
  var props = params.properties || {};
  //双竖线实现默认值的写法
  var iframe = $(params.iframe) || false;
  //iframe的onload事件,需要IE5.5+的支持
  var ōnload = props.onload || $empty;
  //及时删除,避免内存泄漏
  delete props.onload;
  //为了兼容,同时定义id和name属性
  props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time());
  iframe = new Element(iframe || 'iframe', props);
  var ōnFrameLoad = function(){
   //取iframe页的域
   var host = $try(function(){
    return iframe.contentWindow.location.host;
   });
   //判断有否跨域,没跨域则对iframe内对象进行moo式包装
   if (host && host == window.location.host){
    //对iframe内的window对象进行包装
    var win = new Window(iframe.contentWindow);
    //对iframe内的document对象进行包装
    var doc = new Document(iframe.contentWindow.document);
    //对iframe内的Element对象进行包装
    $extend(win.Element.prototype, Element.Prototype);
   }
   //执行onload事件,将事件内的this指向iframe内的window对象并传送iframe内的document作唯一参数
   onload.call(iframe.contentWindow, iframe.contentWindow.document);
  };
  //如果iframe未在DOM,添加onload事件监听,否则直接执行监听onload的函数
  (!window.frames[props.id]) ? iframe.addListener('load', onFrameLoad) : onFrameLoad();
  return iframe;
 }

});